package com.zenithmind.article.pojo.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 数据传输对象基类
 * 遵循单一职责原则：提供通用的DTO字段和验证
 * 遵循开闭原则：子类可以扩展而不修改基类
 */
@Data
@Schema(description = "数据传输对象基类")
public abstract class BaseDTO implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @Schema(description = "主键ID")
    private String id;
    
    @Schema(description = "创建时间")
    private LocalDateTime createTime;
    
    @Schema(description = "更新时间")
    private LocalDateTime updateTime;
    
    /**
     * 验证DTO数据的有效性
     * 子类可以重写此方法添加自定义验证逻辑
     * 
     * @return 验证是否通过
     */
    public boolean isValid() {
        return true;
    }
    
    /**
     * 获取业务标识
     * 子类可以重写此方法返回业务相关的标识
     * 
     * @return 业务标识
     */
    public String getBusinessKey() {
        return id;
    }
    
    /**
     * 验证必填字段
     * 子类可以重写此方法验证必填字段
     * 
     * @return 验证是否通过
     */
    protected boolean validateRequired() {
        return true;
    }
    
    /**
     * 验证业务规则
     * 子类可以重写此方法验证业务规则
     * 
     * @return 验证是否通过
     */
    protected boolean validateBusinessRules() {
        return true;
    }
}
